#pragma once

#include <string>
#include <chrono>

namespace hft {

// 订单方向
enum class OrderSide {
    Buy,    // 买入
    Sell    // 卖出
};

// 订单类型
enum class OrderType {
    Market,     // 市价单
    Limit,      // 限价单
    Stop,       // 止损单
    StopLimit   // 止损限价单
};

// 订单状态
enum class OrderStatus {
    Created,        // 已创建
    Pending,        // 待处理
    PartialFilled,  // 部分成交
    Filled,         // 全部成交
    Canceled,       // 已取消
    Rejected        // 已拒绝
};

// 持仓方向
enum class PositionSide {
    Long,   // 多头
    Short,  // 空头
    Net     // 净持仓
};

// 订单结构
struct Order {
    std::string order_id;                        // 订单ID
    std::string symbol;                          // 合约代码
    OrderSide side = OrderSide::Buy;             // 订单方向
    OrderType type = OrderType::Limit;           // 订单类型
    OrderStatus status = OrderStatus::Created;   // 订单状态
    double price = 0.0;                          // 价格
    double stop_price = 0.0;                     // 止损价格
    int volume = 0;                              // 数量
    int filled_volume = 0;                       // 已成交数量
    double avg_fill_price = 0.0;                 // 平均成交价格
    std::string strategy_id;                     // 策略ID
    std::string account;                         // 账户
    std::string exchange;                        // 交易所
    std::string remark;                          // 备注
    std::chrono::system_clock::time_point create_time = std::chrono::system_clock::now();  // 创建时间
    std::chrono::system_clock::time_point update_time = std::chrono::system_clock::now();  // 更新时间
};

// 成交结构
struct Trade {
    std::string trade_id;                        // 成交ID
    std::string order_id;                        // 订单ID
    std::string symbol;                          // 合约代码
    OrderSide side = OrderSide::Buy;             // 成交方向
    double price = 0.0;                          // 成交价格
    int volume = 0;                              // 成交数量
    std::chrono::system_clock::time_point trade_time = std::chrono::system_clock::now();  // 成交时间
    std::string exchange_trade_id;               // 交易所成交ID
    std::string account;                         // 账户
    std::string strategy_id;                     // 策略ID
};

} // namespace hft